﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include "ElementAttributeValueType.h"

namespace gcmp
{

    /// \brief 元素属性组件
    /// 
    /// 每个元素有且只有一个属性组件
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IElementAttributes : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementAttributes, gcmp::IDbObject)

    public:
        /// \brief 查询所有Attribute的总数
        /// \return size_t 总数
        virtual size_t GetCount() const = 0;

        /// \brief 查询所有Attribute的key
        /// \return std::vector<std::wstring> 所有Attribute的key
        virtual std::vector<std::wstring> GetKeys() const = 0;

        /// \brief 查询是否存在键为key的Attribute
        /// \param key 元素数据类型所对应的key
        /// \return bool 存在返回true；不存在返回false
        virtual bool HasAttributes(const std::wstring& key) const = 0;

        /// \brief 获取键对应的值的类型
        /// \param key 元素数据类型所对应的key
        /// \param[out] valueType 值的类型
        /// \return bool 获取成功则返回true，值类型在valueType里；失败则返回false
        virtual bool GetAttributeValueType(const std::wstring& key, ElementAttributeValueType& valueType) const = 0;

        /// \brief 获取值是Int32类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsInt32(const std::wstring& key, Int32& value) const = 0;

        /// \brief 获取值是UInt32类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsUInt32(const std::wstring& key, UInt32& value) const = 0;

        /// \brief 获取值是Int64类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsInt64(const std::wstring& key, Int64& value) const = 0;

        /// \brief 获取值是UInt64类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsUInt64(const std::wstring& key, UInt64& value) const = 0;

        /// \brief 获取值是Double类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsDouble(const std::wstring& key, double& value) const = 0;

        /// \brief 获取值是String类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsString(const std::wstring& key, std::wstring& value) const = 0;

        /// \brief 获取值是Bool类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsBool(const std::wstring& key, bool& value) const = 0;

        /// \brief 获取值是Binary类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param[out] value 元素属性的值
        /// \return bool 获取成功则返回true，值在value里；失败则返回false
        virtual bool GetAttributeValueAsBinary(const std::wstring& key, std::vector<Byte>& value) const = 0;

    public:
        /// \brief 添加值是Int32类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsInt32(const std::wstring& key, Int32 value) = 0;

        /// \brief 添加值是UInt32类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsUInt32(const std::wstring& key, UInt32 value) = 0;

        /// \brief 添加值是Int64类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsInt64(const std::wstring& key, Int64 value) = 0;

        /// \brief 添加值是UInt64类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsUInt64(const std::wstring& key, UInt64 value) = 0;

        /// \brief 添加值是Double类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsDouble(const std::wstring& key, double value) = 0;

        /// \brief 添加值是String类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsString(const std::wstring& key, const std::wstring& value) = 0;

        /// \brief 添加值是Bool类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsBool(const std::wstring& key, bool value) = 0;

        /// \brief 添加值是Binary类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要添加的元素属性值
        /// \return bool 添加成功，返回true；添加失败（如果已经存在值），返回false
        virtual bool AddAttributeWithValueAsBinary(const std::wstring& key, const std::vector<Byte>& value) = 0;

    public:
        /// \brief 删除键为key的Attribute
        /// \param key 元素数据类型所对应的key
        /// \return bool 成功删除返回true，不存在返回false
        virtual bool DeleteAttribute(const std::wstring& key) = 0;

        /// \brief 删除所有的Attribute
        virtual void DeleteAllAttributes() = 0;

    public:
        /// \brief 设置值是Int32类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsInt32(const std::wstring& key, Int32 value) = 0;

        /// \brief 设置值是UInt32类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsUInt32(const std::wstring& key, UInt32 value) = 0;

        /// \brief 设置值是Int64类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsInt64(const std::wstring& key, Int64 value) = 0;

        /// \brief 设置值是UInt64类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsUInt64(const std::wstring& key, UInt64 value) = 0;

        /// \brief 设置值是Double类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsDouble(const std::wstring& key, double value) = 0;

        /// \brief 设置值是String类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsString(const std::wstring& key, const std::wstring& value) = 0;

        /// \brief 设置值是Bool类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsBool(const std::wstring& key, bool value) = 0;

        /// \brief 设置值是Binary类型的Attribute
        /// \param key 元素数据类型所对应的key
        /// \param value 需要设置的的元素属性值
        /// \return bool 成功设置，返回true；存在该值，返回false
        virtual bool SetAttributeValueAsBinary(const std::wstring& key, const std::vector<Byte>& value) = 0;
    };

}
